虚拟内存

VM 基本概念

 

 

VM基本思想

物理寻址

image-20231205132446050

虚拟寻址

image-20231205132509951

image-20231205133113612

VM意义

image-20231205200708413

VM作为工具

期望:足够快的,足够大的,私有的

  1. 它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效地使用了主存。

  2. 它为每个进程提供了一致的地址空间,从而简化了内存管理。

  3. 它保护了每个进程的地址空间不被其他进程破坏。

VM作为缓存的工具

  1. Memory hierarchy

image-20231030173059389

  1. DRAM硬件组织结构

image-20231205200835128

  1. 内存是磁盘的缓存

    1. 在VM的惯用说法中,页——缓存块,交换/页面调度——传送块

    2. 物理页在内存中,虚拟页在磁盘中

    3. 采用按需页面调度的方式

  2. DRAM缓存是全相联的,任意物理页都可以包含任意虚拟页

虚拟页

在任意时刻,虚拟页面的集合都分为三个不相交的子集:

image-20231205201203939

页表

页表结构
  1. 抽象地,假定PTE由一个有效位和一个n位地址字段组成的

    image-20231205162943932

  2. 具体地,x86的页表项组成

    • x86-32

      image-20231205162635912

    • x86-64

      image-20231205162711241

      image-20231205162731654

页命中

image-20231205163109011

缺页

Waiting until the miss to copy the page to DRAM is known as demand paging.(按需页面调度)

image-20231205163133908

替换策略

image-20231205191459814

分配页面

image-20231205163310820

效率保证

image-20231205201615872

VM作为内存管理的工具

操作系统位每个进程提供一个独立的页表,也即一个独立的虚拟地址空间

image-20231205163410274

VM作为内存保护的工具

image-20231205141642630

地址翻译

符号表

image-20231205142538257

考虑一个有SRAM高速缓存和VM的系统

宏观理解

  1. 物理地址直接访问Disk

  2. 物理地址访问+MM作为Disk的缓存

  3. 物理地址访问+Cache作为MM的缓存+MM作为Disk的缓存

  4. 虚拟地址访问+地址翻译+Cache作为MM的缓存+MM作为Disk的缓存

MAP:VASPAS
MAP(A)={Aif data at virtual addr. A are present at physical addr. A in PASif data at virtual addr. A are not present in physical memory

image-20231205202023873

微观理解

页表

页表+Cache

image-20231205153711618

页表+TLB+Cache

多级页表+TLB+Cache

翻译细节

Cache

设计PPO=CI+CO,使得在借由 VPN 获取 PPN 时,可以同步利用 VPO 对cache进行查找

image-20231205192704912

TLB

  1. 虚拟地址中用以访问TLB的组成部分

    image-20231205192958895

  2. TLB结构:8路组相连的命中率几乎和全相连命中率几乎一样

17680513-60a79a00ee49bc26

  1. TLB存储:Contains complete page table entries for small number of pages

页面大小

  1. 小页面的优点

    • 内部碎片:随便选择一个数据段、堆栈段很可能不会恰好装满整数个页面,平均有一半为空

    • 运行小型程序时,对于内存的占用较少

  2. 小页面的缺点

    • 小页面,意味着需要更多的页面和更大的页表:存储空间+传输时间

    • 对TLB不友好:小页表意味着地址转换时需要更多的页表映射表项,意味着TLB缓存的表项多,降低TLB的命中率;

  3. 只考虑碎片浪费和页表所需的内存

    屏幕截图 2023-12-05 194306

例子:内存系统

简易例子

Core i7

系统结构

image-20231208152147071

地址翻译

image-20231208152205340

image-20231208152236043

PTE结构

前三级

image-20231208152422554

第四级

image-20231208152433208

内存管理

img

image-20231208153206418

虚拟内存区域

image-20231208153358940

缺页异常处理

image-20231208153413638

  1. 地址是否存在:是否在某个段内

  2. 访问是否合法:查看读/写/执行位

  3. 否则,缺页导致:将页面调入

内存映射

image-20231208153130176

交换空间

image-20231208153800121

相关函数

image-20231208162618838

image-20231208162630491

动态内存分配

显示分配器

基本实现

函数实现

image-20231210135812530

要求
  1. 处理任意请求序列

  2. 立即响应请求

  3. 只使用堆

  4. 对齐块(对齐要求)

  5. 不修改已分配的块

目标
  1. 最大化呑吐率

  2. 最大化内存利用率

image-20231210135914937

碎片
  1. 内部碎片:已分配块比有效载荷大

  2. 外部碎片:空闲内存合计可满足分配请求,但单独空闲块不够

问题
  1. 空闲块组织:我们如何记录空闲块?

  2. 放置:我们如何选择一个合适的空闲块来放置一个新分配的块?

  3. 分割:在将一个新分配的块放置到某个空闲块之后,我们如何处理这个空闲块中的剩余部分?

  4. 合并:我们如何处理一个刚刚被释放的块?

image-20231210141407432

隐式空闲链表

基本结构
  1. 堆块格式

    image-20231210140514394

     

  2. 组织形式

    image-20231210140535183

  3. 分割空闲块

    image-20231210140556540

  4. 获取额外的堆内存

放置策略

image-20231210141715107

合并空闲块
  1. 合并的概念

    • 当分配器释放一个已分配块时,可能有其他空闲块与这个新释放的空闲块相邻。这些邻接的空闲块可能引起一种现象,叫做假碎片(fault fragmentation)

    • 任何实际的分配器都必须合并相邻的空闲块,这个过程称为合并(coalescing)

  2. 合并策略

    • 立即合并(immediate coalescing)

    • 推迟合并(deferred coalescing)

  3. 边界标记实现

    image-20231210140813364

    • 考虑当分配器释放当前块时所有可能存在的情况:

      image-20231210141826652

    img

  4. 边界标记优化:只有空闲块需要尾部

    image-20231210141918468

    WPS拼图0

显式空闲链表

  1. 块结构

    image-20231210142607179

  2. 组织方式:双向空闲链表

  3. 排序策略

    image-20231210142942810

分离空闲链表

img

img

简单分离存储
分离适配
伙伴系统

垃圾收集器

PixPin_2024-12-03_17-14-15

隐式分配器

C程序中常见与内存有关的错误